import uuid

from django.db import models


# Create your models here.


class UserInfo(models.Model):
    """用户表"""
    phone = models.CharField(verbose_name="手机号", max_length=64, unique=True)
    code = models.CharField(verbose_name="用户密码", max_length=64)
    name = models.CharField(verbose_name='用户姓名', max_length=16)
    age = models.IntegerField(verbose_name="用户年龄")
    time = models.DateField(auto_now=False, verbose_name='封禁日期')    # 默认为创建时的时间
    idcard = models.UUIDField(verbose_name='用户卡号',
                              max_length=5,
                              primary_key=True,
                              auto_created=True,
                              default=uuid.uuid4,
                              editable=False
                              )
    types = models.ForeignKey(to="UserType",
                              db_constraint=False,
                              related_name='type_user',
                              default=1,
                              verbose_name='关联用户类型',
                              on_delete=models.CASCADE,
                              )
    blacklist = models.ForeignKey(to="UserBlack",
                                  db_constraint=False,
                                  related_name='black_user',
                                  default=1,
                                  verbose_name='使用状态',
                                  on_delete=models.CASCADE,
                                  )
    def __str__(self):
        return self.name


class UserType(models.Model):
    """使用者类型表"""
    usetype = models.CharField(verbose_name="使用者类型", max_length=16)

    def __str__(self):
        return self.usetype


class UserBlack(models.Model):
    """用户状态表"""
    useblack = models.CharField(verbose_name="用户状态", max_length=16)

    def __str__(self):
        return self.useblack


class UserBook(models.Model):
    """用户书架表，子表"""
    book_id = models.CharField(verbose_name='书籍id', max_length=16)
    time = models.DateField(auto_now=False, verbose_name='创建时间')    # 默认为创建时的时间
    user = models.ForeignKey(UserInfo,
                              on_delete=models.CASCADE,
                              related_name='userinfo_userbooks',  # 与userbook_set相同，主表外键的属性就是userbook_set
                              verbose_name='关联用户')
    def __str__(self):
        return self.book_id


class UserHistory(models.Model):
    """用户借阅历史表"""
    book_id = models.CharField(verbose_name='书籍id', max_length=16)
    time = models.DateField(auto_now=False, verbose_name='创建时间')    # 默认为创建时的时间
    user = models.ForeignKey(UserInfo,
                              on_delete=models.CASCADE,
                              related_name='userinfo_UserHistory',
                              verbose_name='关联用户')

    def __str__(self):
        return self.book_id


class UserCollection(models.Model):
    """用户收藏表"""
    book_id = models.CharField(verbose_name='书籍id', max_length=16)
    user = models.ForeignKey(UserInfo,
                              on_delete=models.CASCADE,
                              related_name='userinfo_UserCollection',
                              verbose_name='关联用户')
    def __str__(self):
        return self.book_id


class Types(models.Model):
    """主表
    一个书籍类型（types）对应多个书本（books）模型
    django 默认每个主表的对象都有一个是外键的属性，可以通过它来查询到所有属于主表的子表的信息。
    这个属性的名称默认是以子表的名称小写加上_set()来表示。实例化时如果主表是types,子表是book,所以主表外键的属性就是book_set
    # 那么实现上面的需求，可以使用types.book_set.all()。也可以使用types.person_book.all()获得其对应的子表数据集
    （related_name='types_books'）。
    """

    def __str__(self):
        return self.name

    name = models.CharField(max_length=32, verbose_name='类型名称')


class Book(models.Model):
    """主表: types
       子表：books
    子表在主表中对应的外键属性：related_name = 'types_books'
    """
    name = models.CharField(verbose_name='书籍名', max_length=32)
    writer = models.CharField(verbose_name='作者', max_length=16)
    all_nums = models.IntegerField(verbose_name='总库存数')
    lend_nums = models.IntegerField(verbose_name='借出数')
    publisher = models.CharField(verbose_name='出版社', max_length=32)
    cover = models.ImageField(verbose_name='图书封面', upload_to='images/%Y/%m/%d')
    introduction = models.TextField(verbose_name='简介', max_length=300)
    types = models.ForeignKey(Types,
                              on_delete=models.CASCADE,  # 当类型删除，旗下的book表也会删除
                              related_name='types_books',  # 与book_set相同，主表外键的属性就是book_set
                              default="未知出版社",
                              verbose_name='关联类型')

    def __str__(self):
        return self.name
